package com.chuangjiangx.member.basic.ddd.domain.model;

import com.chuangjiangx.dddbase.Repository;
import com.chuangjiangx.member.basic.dao.mapper.InWxAppletTokenMapper;
import com.chuangjiangx.member.basic.dao.model.InWxAppletToken;
import com.chuangjiangx.member.basic.dao.model.InWxAppletTokenExample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;

import java.util.List;

/**
 * 微信应用Token仓储
 * @author 马文韬
 * @version 1.0
 * @date: 2018/9/15
 */
@Component("member.module.WxAppletTokenRespository")
public class WxAppletTokenRepository implements Repository<WxAppletToken, WxAppletTokenId> {

    @Autowired
    private InWxAppletTokenMapper inWxAppletTokenMapper;

    @Override
    public WxAppletToken fromId(WxAppletTokenId wxAppletTokenId) {
        throw new NotImplementedException();
    }

    public WxAppletToken fromMerchantId(MerchantId merchantId) {
        InWxAppletTokenExample example = new InWxAppletTokenExample();
        example.createCriteria().andMerchantIdEqualTo(merchantId.getId());
        List<InWxAppletToken> inWxAppletTokens = inWxAppletTokenMapper.selectByExample(example);

        return inWxAppletTokens.isEmpty() ? null : wrap(inWxAppletTokens.get(0));
    }

    @Override
    public void update(WxAppletToken wxAppletToken) {
        throw new NotImplementedException();
    }

    @Override
    public void save(WxAppletToken wxAppletToken) {
        throw new NotImplementedException();
    }

    /**
     * PO 对象转换为 领域对象
     * @param inWxAppletToken 数据库PO对象
     * @return 转换的领域对象
     */
    private WxAppletToken wrap(InWxAppletToken inWxAppletToken) {
        if (inWxAppletToken == null) {
            return null;
        }

        WxAppletToken wxAppletToken = new WxAppletToken(
                new MerchantId(inWxAppletToken.getMerchantId()),
                inWxAppletToken.getAuthorizerAppid(),
                inWxAppletToken.getAuthorizerSecret(),
                inWxAppletToken.getPaySwitch()
        );
        wxAppletToken.setId(new WxAppletTokenId(inWxAppletToken.getId()));
        return wxAppletToken;
    }

    public WxAppletToken fromMerchantIdAndProductId(MerchantId merchantId, Long productId) {
        InWxAppletTokenExample example = new InWxAppletTokenExample();
        example.createCriteria().andMerchantIdEqualTo(merchantId.getId()).andProductIdEqualTo(productId);
        List<InWxAppletToken> inWxAppletTokens = inWxAppletTokenMapper.selectByExample(example);

        return inWxAppletTokens.isEmpty() ? null : wrap(inWxAppletTokens.get(0));
    }
}
